/**
 * 编写一个算法来判断一个数 n 是不是快乐数。
 * @param n 
 */
 const isHappy = (n: number): boolean => {
    // 如果已经是1了, 那就是快乐数字
    if (n === 1) return true;

    let slow = n,
        fast = getNext(slow);
    
    // fast相当于一个隐形的环状链表
    while (fast !== 1 && fast !== slow) {
        slow = getNext(slow)
        fast = getNext(getNext(fast))
    }
    return fast === 1
};

/**
 * 根据快乐数字的定义获取下一个值
 * @param n 
 */
const getNext = (n: number) => n.toString().split('').map(n => (+n * +n)).reduce((a, b) => a + b)

const isHappy2 = (n: number): boolean => {
    // 如果已经是1了, 那就是快乐数字
    if (n === 1) return true;

    let str = n.toString()
    let total = 0

    for (let i = 0; i < str.length; i++) {
        total += (+str[i]) ** 2
    }

    return isHappy(total)
};